home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / misc / mmulib / install / buildmmuconfig.rexx next >
OS/2 REXX Batch file  |  1999-11-29  |  13KB  |  310 lines

  1. /*********************************************************
  2.  ** BuildMMUConfig                    **
  3.  **                            **
  4.  ** Builds the MMU-Configuration file automatically    **
  5.  ** from the boards information, including kludges for    **
  6.  ** bad or mis-designed hardware            **
  7.  ** Version 1.03 © 1999 THOR-Software, Thomas Richter   **
  8.  ** 07.11.1999                                          **
  9.  ** with special thanks to Tobias Abt and Niels Knoop    **
  10.  ** for the Board Id's                    **
  11.  *********************************************************/
  12.  
  13. PARSE ARG destination .
  14.  
  15.     if (destination = '') then
  16.         destination = '*'
  17.  
  18.     
  19.     rec = 25;
  20.  
  21.     if (OPEN(.out,destination,'W')) THEN; DO
  22.         rv=WRITELN(.out,";*************************************************************************");
  23.         rv=WRITELN(.out,";** MMU Configuration file                                              **");
  24.         rv=WRITELN(.out,";**                                                                     **");
  25.         rv=WRITELN(.out,";** this file is read on startup by the mmu.library and used to modify  **");
  26.         rv=WRITELN(.out,";** the pre-calculated or scanned MMU table                             **");
  27.         rv=WRITELN(.out,";**                                                                     **");
  28.         rv=WRITELN(.out,";** © 1999 THOR Software, Thomas Richter                                **");
  29.         rv=WRITELN(.out,";*************************************************************************");
  30.         rv=WRITELN(.out,"");
  31.         rv=WRITELN(.out,"");
  32.         rv=WRITELN(.out,"");
  33.         rv=WRITELN(.out,"; the current version of the MMU library knows three commands that can");
  34.         rv=WRITELN(.out,"; be used in this file:");
  35.         rv=WRITELN(.out,"; CLEARTTX clears all or parts of the transparent translation registers");
  36.         rv=WRITELN(.out,"; ADDMEM   adds memory to the exec free list pool. BE WARNED, this command");
  37.         rv=WRITELN(.out,";          does NOT modify the MMU tables, this must be done manually with");
  38.         rv=WRITELN(.out,";          SETCACHEMODE");
  39.         rv=WRITELN(.out,"; SETCACHEMODE  defines the MMU tables.");
  40.         rv=WRITELN(.out,"; DESCRIPTORCACHEINHIBIT defines whether the data cache should be disabled");
  41.         rv=WRITELN(.out,"; for the MMU descriptors. It's usually OFF meaning the cache will remain");
  42.         rv=WRITELN(.out,"; enabled. This is fine for the mmu.library, but certain hacks might require");
  43.         rv=WRITELN(.out,"; an ON argument here. Note that this means more work for the library.");
  44.         rv=WRITELN(.out,"");
  45.         rv=WRITELN(.out,"");
  46.         rv=WRITELN(.out,"ClearTTx        ;ignore all TTX registers if any. We don't need them");
  47.         rv=WRITELN(.out,"");
  48.         rv=WRITELN(.out,";Board specific setup follows here,");
  49.         rv=WRITELN(.out,";generated by BuildMMUConfig 1.00 © 1999 THOR-Software");
  50.         rv=WRITELN(.out,"");
  51.         ADDRESS COMMAND "ShowBoards to T:BoardInfo";
  52.         if (OPEN(.boardinfo,"T:BoardInfo",'R')) then; do
  53.             rec = 0;
  54.             DO UNTIL EOF(.boardinfo)
  55.                 line = READLN(.boardinfo)
  56.                 IF line ~= '' THEN; DO
  57.                     PARSE VAR line 'Type:' type 'Product:' product 'Manufacturer:' mf 'Serial#:' id 'BoardAddr:' from 'BoardSize:' size;
  58.                     type=X2D(type);
  59.                     product=X2D(product);
  60.                     mf=X2D(mf);
  61.                     id=X2D(id);
  62.                     from=X2D(from);
  63.                     size=X2D(size);
  64.                     rv=WRITELN(.out,";Setup for board "mf"/"product);
  65.                     rv=IdentifyBoard(type,product,mf,id,from,size);
  66.                     rv=WRITELN(.out,"");    
  67.                 END
  68.             END    
  69.             rv=CLOSE(.boardinfo);
  70.         END
  71.  
  72.         memfix = 0;
  73.         ppcheck = 0;
  74.         ADDRESS COMMAND 'P5Identify'
  75.         p5mode = RC;
  76.         ADDRESS COMMAND 'FindPort "MMU-BOOT-Port"'
  77.         portmode = RC;
  78.  
  79.         IF p5mode ~= 0 THEN;DO
  80.             WRITELN(.out,"");
  81.             WRITELN(.out,";P5 fixes follow here:");
  82.             WRITELN(.out,"");
  83.         END;            
  84.  
  85.         IF portmode = 0 THEN;DO
  86.             WRITELN(.out,"");
  87.             WRITELN(.out,";Several P5 boards build a private MMU setup on boot");
  88.             WRITELN(.out,";using a kludge called the MMU-Boot-Port. To run this");
  89.             WRITELN(.out,";kludge, the following external command is run from");
  90.             WRITELN(.out,";LIBS:mmu/ as all other external commands");
  91.             WRITELN(.out,"ScanMMUPort");
  92.             SAY "Copying the file ScanMMUPort to LIBS:mmu/ScanMMUPort for the setup";
  93.             OPTIONS FAILAT 15
  94.             ADDRESS COMMAND 'MakeDir >NIL: LIBS:MMU/'
  95.             OPTIONS FAILAT 10
  96.             ADDRESS COMMAND 'Copy >NIL: ScanMMUPort to LIBS:MMU/ScanMMUPort'
  97.             WRITELN(.out,";SetCacheMode FROM 0xFFFF8000 SIZE 0x00008000 VALID CACHEINHIBIT");
  98.             WRITELN(.out,"");
  99.         END;
  100.  
  101.         IF p5mode = 1 THEN;DO
  102.             rv=WRITELN(.out,"");
  103.             rv=WRITELN(.out,";Several P5 boards need the following to be set:");
  104.             rv=WRITELN(.out,"SetCacheMode FROM 0xfff00000 SIZE 0x00020000 VALID CACHEINHIBIT");
  105.             rv=WRITELN(.out,"SetCacheMode FROM 0x00f00000 SIZE 0x00080000 VALID WRITETHROUGH");
  106.             rv=WRITELN(.out,"");
  107.         END;
  108.  
  109.         IF p5mode = 2 THEN; DO
  110.             rv=WRITELN(.out,"");
  111.             rv=WRITELN(.out,";CyberStorm PPC board memory setup follows here:");
  112.             rv=WRITELN(.out,"SetCacheMode FROM 0xfff00000 SIZE 0x00080000 VALID CACHEINHIBIT");
  113.             rv=WRITELN(.out,"SetCacheMode FROM 0x00f00000 SIZE 0x00050000 VALID CACHEINHIBIT");
  114.             rv=WRITELN(.out,"SetCacheMode FROM 0x00f60000 SIZE 0x00020000 VALID CACHEINHIBIT");
  115.             ppccheck = 1;
  116.             memfix = 1;
  117.         END;
  118.  
  119.         IF p5mode = 3 THEN; DO
  120.             rv=WRITELN(.out,"");
  121.             rv=WRITELN(.out,";CyberStorm MK3 board memory setup follows here:");
  122.             rv=WRITELN(.out,"SetCacheMode FROM 0x00f00000 SIZE 0x00050000 VALID CACHEINHIBIT");
  123.             rv=WRITELN(.out,"SetCacheMode FROM 0x00f60000 SIZE 0x00020000 VALID CACHEINHIBIT");
  124.             ppccheck = 1;
  125.             memfix = 1;
  126.         END;
  127.  
  128.         IF p5mode = 4 THEN; DO
  129.             rv=WRITELN(.out,"");
  130.             rv=WRITELN(.out,";Blizzard PPC board memory setup follows here:");
  131.             rv=WRITELN(.out,"SetCacheMode FROM 0xfff00000 SIZE 0x00080000 VALID CACHEINHIBIT");
  132.             rv=WRITELN(.out,"SetCacheMode FROM 0x00f00000 SIZE 0x00080000 VALID CACHEINHIBIT");
  133.             ppccheck = 1;
  134.             memfix = 2;
  135.         END;
  136.  
  137.         IF ppccheck = 1 THEN; DO
  138.             ADDRESS COMMAND 'PPCIdentify'
  139.             ppccheck = RC;
  140.         END;
  141.  
  142.         IF ppccheck = 1 THEN; DO
  143.             rv=WRITELN(.out,";More P5 PPC setups:");
  144.             rv=WRITELN(.out,"SetCacheMode FROM 0xe0000000 SIZE 0x01000000 VALID CACHEINHIBIT IMPRECISE NONSERIAL");
  145.             rv=WRITELN(.out,"SetCacheMode FROM 0xef000000 SIZE 0x00020000 VALID CACHEINHIBIT");
  146.             rv=WRITELN(.out,"SetCacheMode FROM 0xfff80000 SIZE 0x00020000 VALID CACHEINHIBIT");
  147.             rv=WRITELN(.out,"SetCacheMode FROM 0xfffc0000 SIZE 0x00040000 VALID CACHEINHIBIT");
  148.         END;
  149.  
  150.         IF memfix ~= 0 THEN; DO
  151.             rv=WRITELN(.out,"");
  152.             rv=WRITELN(.out,";Even more P5 memory fixes. If the following memory is in your");
  153.             rv=WRITELN(.out,";memory free list, this should be marked as cache-inhibited");
  154.             rv=WRITELN(.out,";possibly because of bus logic problems. Note that setting the cache");
  155.             rv=WRITELN(.out,";cache mode does not validate the access.");
  156.             IF memfix = 1 THEN; DO
  157.                 rv=WRITELN(.out,"SETCACHEMODE FROM 0x08000000 SIZE 0x08000000 CACHEINHIBIT");
  158.             END; 
  159.             IF memfix = 2 THEN; DO
  160.                 rv=WRITELN(.out,"SETCACHEMODE FROM 0x40000000 SIZE 0x80000000 CACHEINHIBIT");
  161.             END;
  162.             rv=WRITELN(.out,"");
  163.         END
  164.  
  165.         rv=WRITELN(.out,"");
  166.         rv=CLOSE(.out);
  167.         ADDRESS COMMAND 'Delete T:BoardInfo QUIET'
  168.     END    
  169.  
  170. EXIT rec
  171.  
  172. IdentifyBoard:    PROCEDURE
  173. PARSE ARG type,product,mf,id,from,size
  174.  
  175.     sp = 0;
  176.     
  177.     IF BitExtract(type,5) = '1' THEN; DO
  178.         rv=WRITELN(.out,";This board contains memory and requires no special threadment.");
  179.         rv=WRITELN(.out,";but in case accessing this memory with COPYBACK enabled causes crashes,");
  180.         rv=WRITELN(.out,";please remove the semicolon in front of the next line:");
  181.         rv=WRITELN(.out,";SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  182.         sp = 1;
  183.     END; ELSE; DO
  184.         z2 = 0
  185.         z3 = 0
  186.         if (from >= X2D('00200000')) & (from+size <= X2D('00A00000')) THEN; DO
  187.             z2 = 1;
  188.         END;
  189.         if (from >= X2D('10000000')) & (from+size <= X2D('7FFFFFFF')) THEN; DO
  190.             z3 = 1;
  191.         END;
  192.         IF (mf = 18260) & (product = 19) THEN; DO
  193.             rv=WRITELN(.out,";Altais");
  194.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  195.             sp = 1;
  196.         END;
  197.         IF (mf = 18260) & (product = 16) & z3 THEN; DO
  198.             rv=WRITELN(.out,";Retina Z3");
  199.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('00c00000'))" SIZE 0x00400000 CACHEINHIBIT NONSERIAL IMPRECISE");
  200.             sp = 1;
  201.         END;
  202.         IF (mf = 2117) & (product = 3) THEN; DO
  203.             rv=WRITELN(.out,";Merlin");
  204.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('00c00000'))" SIZE 0x00200000 CACHEINHIBIT NONSERIAL IMPRECISE");
  205.             sp = 1;
  206.         END;            
  207.         IF (mf = 2181) & (product = 0) & (size >= X2D('00100000')) & z2 THEN; DO
  208.             rv=WRITELN(.out,";oMniBus");
  209.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('00c00000'))" SIZE 0x00200000 CACHEINHIBIT NONSERIAL IMPRECISE");
  210.             sp = 1;
  211.         END;            
  212.         IF (mf = 2092) & (product = 33) & z3 THEN; DO
  213.             rv=WRITELN(.out,";Graffity Z3");
  214.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('00c00000'))" SIZE 0x00200000 CACHEINHIBIT NONSERIAL IMPRECISE");
  215.             sp = 1;
  216.         END;
  217.         IF (mf = 2092) & (product = 33) & z2 THEN; DO
  218.             rv=WRITELN(.out,";Graffity Z2");
  219.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  220.             sp = 1;
  221.         END;        
  222.         IF (mf = 2167) & (product = 1) & z2 THEN; DO
  223.             rv=WRITELN(.out,";Domino");
  224.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  225.             sp = 1;
  226.         END;
  227.         IF (mf = 2167) & (product = 11) THEN; DO
  228.             rv=WRITELN(.out,";Picasso II");
  229.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  230.             sp = 1;
  231.         END;
  232.         IF (mf = 2167) & (product >= 21) & (product <= 24) THEN; DO
  233.             rv=WRITELN(.out,";Picasso IV");
  234.             sp = 1;
  235.         END;
  236.         IF (mf = 2193) & (product = 1) THEN; DO
  237.             rv=WRITELN(.out,";GVP Spectrum");
  238.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  239.             sp = 1;
  240.         END;
  241.         IF (mf = 2195) & (product = 5) THEN; DO
  242.             rv=WRITELN(.out,";Piccolo");
  243.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  244.             sp = 1;
  245.         END;
  246.         IF (mf = 2195) & (product = 10) & z2 THEN; DO
  247.             rv=WRITELN(.out,";Piccolo-SD64 Z2");
  248.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" CACHEINHIBIT NONSERIAL IMPRECISE");
  249.             sp = 1;
  250.         END;
  251.         IF (mf = 2195) & (product = 10) & z3 THEN; DO
  252.             rv=WRITELN(.out,";Piccolo-SD64 Z3");
  253.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x00400000 VALID IOSPACE CACHEINHIBIT NONSERIAL IMPRECISE");
  254.             sp = 1;
  255.         END;
  256.         IF (mf = 8512) & (product = 34) & z3 THEN; DO
  257.             sp = 1;
  258.             rv=WRITELN(.out,";CyberVision Z3");
  259.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" BLANK IOSPACE");
  260.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x01400000 VALID IOSPACE CACHEINHIBIT");
  261.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('01400000'))" SIZE 0x00c00000 VALID IOSPACE CACHEINHIBIT NONSERIAL IMPRECISE");
  262.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('02000000'))" SIZE 0x02000000 VALID IOSPACE CACHEINHIBIT");
  263.         END;
  264.         IF (mf = 8512) & (product = 67) THEN; DO
  265.             sp = 1;
  266.             rv=WRITELN(.out,";CyberVision3D");
  267.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" BLANK IOSPACE");
  268.             IF Z2 THEN; DO
  269.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x00380000 VALID IOSPACE CACHEINHIBIT NONSERIAL IMPRECISE");
  270.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('00380000'))" SIZE 0x00080000 VALID IOSPACE CACHEINHIBIT");
  271.             END; ELSE; DO
  272.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('04000000'))" SIZE 0x01000000 VALID IOSPACE CACHEINHIBIT NONSERIAL IMPRECISE");
  273.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('05000000'))" SIZE 0x00010000 VALID IOSPACE CACHEINHIBIT");
  274.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('05800000'))" SIZE 0x00008000 VALID IOSPACE CACHEINHIBIT");
  275.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('07000000'))" SIZE 0x00008000 VALID IOSPACE CACHEINHIBIT");
  276.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('08000000'))" SIZE 0x00001000 VALID IOSPACE CACHEINHIBIT");
  277.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('0C000000'))" SIZE 0x00010000 VALID IOSPACE CACHEINHIBIT");
  278.                 rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from+X2D('0C0E0000'))" SIZE 0x00001000 VALID IOSPACE CACHEINHIBIT");
  279.             END
  280.         END;    
  281.         IF (mf = 2145) & (product = 33) THEN; DO
  282.             sp = 1;
  283.             rv=WRITELN(.out,";Rainbow 3");
  284.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" BLANK IOSPACE");
  285.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x00400000 VALID IOSPACE CACHEINHIBIT");
  286.         END;
  287.         IF (mf = 8512) & (product = 100) THEN; DO
  288.             sp = 1;
  289.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" BLANK IOSPACE");
  290.         END;
  291.         IF (mf = 8512) & (product = 110) THEN; DO
  292.             sp = 1;
  293.             rv=WRITELN(.out,"SetCacheMode FROM 0x"D2X(from)" SIZE 0x"D2X(size)" BLANK IOSPACE");
  294.         END;
  295.         IF (sp = 0) THEN; DO
  296.             rv=WRITELN(.out,";no special care has been taken for this board.");
  297.         END;
  298.         
  299.     END    
  300.  
  301. RETURN 0
  302.  
  303. ;
  304. ; The AREXX BITTST function seems to be broken. We implement our own
  305. ;
  306. BitExtract:    PROCEDURE
  307. PARSE ARG num,bit
  308.     bit=SUBSTR(C2B(D2C(num)),8-bit,1);
  309. RETURN bit
  310.